/**
 * js中除了基本类型还有内置对象
 * 基本数据类型：
 *          null undefined boolean number string symbol
 * 复杂数据类型：
 *          Array function object
 *
 * 内置对象：
 *          Array Function Date Number Regex Object Error
 */


let str = 'ck'
let ck = new String('ck')
console.log(str instanceof String);
console.log(ck instanceof String)

const  symbol = Symbol('ck')


function foo(){
    console.log('foo')
}

var some = foo;

let obj = {
    someobj:foo
}

// 这三个都是用的foo函数， 其他的也只是对这个函数的引用
console.log(foo)
console.log(some)
console.log(obj.someobj)

// 对象的深拷贝
const kb = JSON.parse(JSON.stringify({name: 'ck'}))
console.log(kb)


let xx = {
    name: 'bob'
}
// Object.defineProperty(xx,'name', {
//     set(val){
//         console.log(`设置name属性值为${val}`)
//         ck.name = val
//     },
//     get() {
//         console.log('获取属性值')
//     }
// })
//
// xx.name
// xx.name = 'kb'

const p = new Proxy(xx, {
    set(target, key,val){
        target[key] = val
        console.log('xx'+key+'改变'+val)
    },
    get(target,key){
        console.log(key in target ? target[key] : 37);
    }
})
p.name
p.age = 11


let products = new Proxy([
    { name: 'Firefox'    , type: 'browser' },
    { name: 'SeaMonkey'  , type: 'browser' },
    { name: 'Thunderbird', type: 'mailer' }
], {
    get: function(obj, prop) {
        // 默认行为是返回属性值， prop ?通常是一个整数
        if (prop in obj) {
            return obj[prop];
        }

        // 获取 products 的 number; 它是 products.length 的别名
        if (prop === 'number') {
            return obj.length;
        }

        let result, types = {};

        for (let product of obj) {
            if (product.name === prop) {
                result = product;
            }
            if (types[product.type]) {
                types[product.type].push(product);
            } else {
                types[product.type] = [product];
            }
        }

        // 通过 name 获取 product
        if (result) {
            return result;
        }

        // 通过 type 获取 products
        if (prop in types) {
            return types[prop];
        }

        // 获取 product type
        if (prop === 'types') {
            return Object.keys(types);
        }

        return undefined;
    },
    set(target, p, value, receiver) {
        if(p in target[0]){
            target[p] = value
            console.log(`${target[p]}的值改变为${value}`)
        }
    }
});

console.log(products[0]); // { name: 'Firefox', type: 'browser' }
console.log(products['Firefox']); // { name: 'Firefox', type: 'browser' }
console.log(products['Chrome']); // undefined
console.log(products.browser); // [{ name: 'Firefox', type: 'browser' }, { name: 'SeaMonkey', type: 'browser' }]
console.log(products.types); // ['browser', 'mailer']
console.log(products.number); // 3
console.log(products[0].name = 'xxxxxxxxxxx')



